/*
 * Copyright 2009 Griffin Brown Digital Publishing Ltd
 * All rights reserved.
 *
 * This file is part of Probatron.
 *
 * Probatron is free software: you can redistribute it and/or modify
 * it under the terms of the Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Probatron is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Affero General Public License for more details.
 *
 * You should have received a copy of the Affero General Public License
 * along with Probatron.  If not, see <http://www.gnu.org/licenses/>.
 */

/*
 * $Header: /TEST/xmlprobe-dev/shail-dev/src/com/griffinbrown/shail/expr/ExprImpl.java,v 1.1
 * 2007/07/23 12:27:29 GBDP\andrews Exp $ $Revision: 1.1 $ $Date: 2009/01/08 14:41:27 $
 * 
 * ====================================================================
 * 
 * Copyright 2000-2002 bob mcwhirter & James Strachan. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met: * Redistributions of source code
 * must retain the above copyright notice, this list of conditions and the following disclaimer. *
 * Redistributions in binary form must reproduce the above copyright notice, this list of
 * conditions and the following disclaimer in the documentation and/or other materials provided
 * with the distribution. * Neither the name of the Jaxen Project nor the names of its
 * contributors may be used to endorse or promote products derived from this software without
 * specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * ==================================================================== This software consists
 * of voluntary contributions made by many individuals on behalf of the Jaxen Project and was
 * originally created by bob mcwhirter <bob@werken.com> and James Strachan
 * <jstrachan@apache.org>. For more information on the Jaxen Project, please see
 * <http://www.jaxen.org/>.
 * 
 * @version $Id: ExprImpl.java,v 1.1 2009/01/08 14:41:27 GBDP\andrews Exp $
 */

package com.griffinbrown.shail.expr;

import org.probatron.jaxen.expr.Expr;

import com.griffinbrown.shail.util.ShailList;
import com.griffinbrown.shail.util.ShailSingletonList;

public abstract class ExprImpl implements Expr
{
    public Expr simplify()
    {
        return this;
    }


    //    static public Iterator convertToIterator(Object obj)
    //    {
    //        if ( obj instanceof Iterator )
    //        {
    //            return (Iterator) obj;
    //        }
    //
    //        if ( obj instanceof List )
    //        {
    //            return ((List)obj).iterator();
    //        }
    //
    //        return new SingleNodeIterator( obj );
    //    }

    static public ShailList convertToList( Object obj )
    {
        if( obj instanceof ShailSingletonList )
        {
            ShailSingletonList list = ( ( ShailSingletonList )obj );
            Object o = list.get( 0 );
            if( o == null ) //list contains a single *node*
            {
                return new ShailList( list );
            }
            else
            {
                return list;
            }
        }

        if( obj instanceof ShailList )
            return ( ShailList )obj;

        return new ShailSingletonList( obj );
    }
}
